From b766b4774afbaf01a0b2291e4d9add1df953dc11 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Sat, 8 Apr 2006 09:05:53 +0100 Subject: [PATCH] Added trace buffer virtual irq to implement non-polling trace record access. Signed-off-by: Rob Gardner --- xen/common/trace.c | 23 +++++++++++++++++++++++ xen/include/public/xen.h | 1 + xen/include/xen/softirq.h | 3 ++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/xen/common/trace.c b/xen/common/trace.c index b0594aa0a8..dbd0f7e7a0 100644 --- a/xen/common/trace.c +++ b/xen/common/trace.c @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include #include @@ -40,6 +42,11 @@ static struct t_buf *t_bufs[NR_CPUS]; static struct t_rec *t_recs[NR_CPUS]; static int nr_recs; +/* High water mark for trace buffers; */ +/* Send virtual interrupt when buffer level reaches this point */ +static int t_buf_highwater; + + /* a flag recording whether initialization has been done */ /* or more properly, if the tbuf subsystem is enabled right now */ int tb_init_done; @@ -50,6 +57,12 @@ static unsigned long tb_cpu_mask = (~0UL); /* which tracing events are enabled */ static u32 tb_event_mask = TRC_ALL; +static void trace_notify_guest(void) +{ + send_guest_global_virq(dom0, VIRQ_TBUF); +} + + /** * alloc_trace_bufs - performs initialization of the per-cpu trace buffers. * @@ -93,6 +106,9 @@ static int alloc_trace_bufs(void) t_recs[i] = (struct t_rec *)(buf + 1); } + t_buf_highwater = nr_recs >> 1; /* 50% high water */ + open_softirq(TRACE_SOFTIRQ, trace_notify_guest); + return 0; } @@ -272,6 +288,13 @@ void trace(u32 event, unsigned long d1, unsigned long d2, buf->prod++; local_irq_restore(flags); + + /* + * Notify trace buffer consumer that we've reached the high water mark. + * + */ + if ( (buf->prod - buf->cons) == t_buf_highwater ) + raise_softirq(TRACE_SOFTIRQ); } /* diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index e18fbf9669..8b2faffc6f 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -77,6 +77,7 @@ #define VIRQ_DEBUG 1 /* V. Request guest to dump debug info. */ #define VIRQ_CONSOLE 2 /* G. (DOM0) Bytes received on emergency console. */ #define VIRQ_DOM_EXC 3 /* G. (DOM0) Exceptional event for some domain. */ +#define VIRQ_TBUF 4 /* G. (DOM0) Trace buffer has records available. */ #define VIRQ_DEBUGGER 6 /* G. (DOM0) A domain has paused for debugging. */ #define VIRQ_XENOPROF 7 /* V. XenOprofile interrupt: new sample available */ #define NR_VIRQS 8 diff --git a/xen/include/xen/softirq.h b/xen/include/xen/softirq.h index 9293b3168e..f4d484f43b 100644 --- a/xen/include/xen/softirq.h +++ b/xen/include/xen/softirq.h @@ -9,7 +9,8 @@ #define NMI_SOFTIRQ 4 #define PAGE_SCRUB_SOFTIRQ 5 #define DOMAIN_SHUTDOWN_FINALISE_SOFTIRQ 6 -#define NR_SOFTIRQS 7 +#define TRACE_SOFTIRQ 7 +#define NR_SOFTIRQS 8 #ifndef __ASSEMBLY__ -- 2.30.2